﻿using System;
using System.Collections.Generic;
using dao.commons;
using dao.daos;
using negocio.commons;
using negocio.entidades;
using negocio.readOnly;
using System.Data.SqlClient;

namespace negocio.servicios
{
    public class EmpleadoService : IService<Empleado>
    {
        private readonly EmpleadoDao dao = new EmpleadoDao();

        public void Insertar(Empleado empleado)
        {
            string valores = GenerarStringValores(empleado);
            dao.Insertar(valores);
        }

        public void Modificar(Empleado empleado)
        {
            string valores = GenerarStringValores(empleado);
            string restriccion = string.Format("ID_EMPLEADO = {0}", empleado.Id);
            dao.Modificar(valores, restriccion);
        }

        public List<Empleado> ObtenerTodo()
        {
            return LeerDataReaderList(dao.ObtenerTodo());
        }

        public List<Empleado> ObtenerActivos()
        {
            return LeerDataReaderList(dao.ObtenerActivos());
        }

        
        public Empleado ObtenerPorId(int idEmpleado)
        {
            SqlDataReader dr = dao.ObtenerPorId(idEmpleado);
            return LeerDataReader(dr);
        }

      
        public List<EmpleadoReadOnly> ObtenerReadOnliesPorNombre(string nombre)
        {
            SqlDataReader dr = dao.ObtenerPorNombre(nombre);
            return LeerDataReaderReadOnlyList(dr);
        }

        public bool Existe(Empleado empleado)
        {
            return dao.Existe(empleado.NroDocumento);
        }

        public List<EmpleadoReadOnly> ObtenerReadOnlies()
        {
            return LeerDataReaderReadOnlyList(dao.ObtenerActivos());
        }

        public List<EmpleadoReadOnly> ObtenerTodosReadOnly()
        {
            return LeerDataReaderReadOnlyList(dao.ObtenerTodo());
        }

        public void Eliminar(Empleado empleado)
        {
            dao.Eliminar(empleado.Id);
        }

        public void Eliminar(int id)
        {
            dao.Eliminar(id);
        }

        #region SOPORTE
        private string GenerarStringValores(Empleado empleado)
        {
            string valores =
                string.Format(
                    "NRO_DOCUMENTO ={0}, ID_TIPO_DOCUMENTO ={1}, NOMBRE ={2}, TELEFONO ={3}, DIRECCION ={4}, ID_CIUDAD ={5}, EMAIL ={6}, FECHA_ALTA ={7}, FECHA_NACIMIENTO ={8}, SUELDO_BASICO ={9}, CANTIDAD_VENTAS ={10}, DADO_BAJA ={11}, SEXO ={12}",
                    empleado.NroDocumento,
                    empleado.IdTipoDocumento.ToString(),
                    empleado.Nombre,
                    empleado.Telefono,
                    empleado.Direccion,
                    empleado.IdCiudad.ToString(),
                    empleado.Email,
                    empleado.FechaAlta.ToString(),
                    empleado.FechaNacimiento.ToString(),
                    empleado.SueldoBasico.ToString(),
                    empleado.CantidadVentas.ToString(),
                    (empleado.DadoBaja ? 1 : 0),
                    (empleado.Masculino == false) ? 0 : 1
                    );
            return valores;
        }

        private Empleado LeerDataReader(SqlDataReader dr)
        {
            Empleado bus = new Empleado();
            if (dr.Read())
            {
                bus.Id = SafeReader.GetSafeInt(dr,"ID_EMPLEADO");
                bus.NroDocumento = SafeReader.GetSafeString(dr, "NRO_DOCUMENTO");
                bus.IdTipoDocumento = SafeReader.GetSafeInt(dr, "ID_TIPO_DOCUMENTO");
                bus.Nombre = SafeReader.GetSafeString(dr, "NOMBRE");
                bus.Telefono = SafeReader.GetSafeString(dr, "TELEFONO");
                bus.Direccion = SafeReader.GetSafeString(dr, "DIRECCION");
                bus.IdCiudad = SafeReader.GetSafeInt(dr, "ID_CIUDAD");
                bus.Email = SafeReader.GetSafeString(dr, "EMAIL");
                bus.FechaAlta = SafeReader.GetSafeDate(dr, "FECHA_ALTA");
                bus.FechaNacimiento = SafeReader.GetSafeDate(dr, "FECHA_NACIMIENTO");
                bus.SueldoBasico = SafeReader.GetSafeInt(dr, "SUELDO_BASICO");
                bus.CantidadVentas = SafeReader.GetSafeInt(dr,"CANTIDAD_VENTAS");
                bus.DadoBaja = Convert.ToBoolean(dr["DADO_BAJA"]);
                bus.Masculino = SafeReader.GetSafeBoolean(dr, "SEXO");
            }
            dr.Close();
            return bus;
        }

        private List<Empleado> LeerDataReaderList(SqlDataReader dr)
        {
            List < Empleado > listbBus = new List<Empleado>();
            while (dr.Read())
            {
                Empleado bus = new Empleado();
                bus.Id = SafeReader.GetSafeInt(dr, "ID_EMPLEADO");
                bus.NroDocumento = SafeReader.GetSafeString(dr, "NRO_DOCUMENTO");
                bus.IdTipoDocumento = SafeReader.GetSafeInt(dr, "ID_TIPO_DOCUMENTO");
                bus.Nombre = SafeReader.GetSafeString(dr, "NOMBRE");
                bus.Telefono = SafeReader.GetSafeString(dr, "TELEFONO");
                bus.Direccion = SafeReader.GetSafeString(dr, "DIRECCION");
                bus.IdCiudad = SafeReader.GetSafeInt(dr, "ID_CIUDAD");
                bus.Email = SafeReader.GetSafeString(dr, "EMAIL");
                bus.FechaAlta = SafeReader.GetSafeDate(dr, "FECHA_ALTA");
                bus.FechaNacimiento = SafeReader.GetSafeDate(dr, "FECHA_NACIMIENTO");
                bus.SueldoBasico = SafeReader.GetSafeInt(dr, "SUELDO_BASICO");
                bus.CantidadVentas = SafeReader.GetSafeInt(dr, "CANTIDAD_VENTAS");
                bus.DadoBaja = Convert.ToBoolean(dr["DADO_BAJA"]);
                bus.Masculino = SafeReader.GetSafeBoolean(dr, "SEXO");
                listbBus.Add(bus);
            }
            
            dr.Close();
            return listbBus;
        }


        private List<EmpleadoReadOnly> LeerDataReaderReadOnlyList(SqlDataReader dr)
        {
            List<EmpleadoReadOnly> listReadOnlies = new List<EmpleadoReadOnly>();
            while (dr.Read())
            {
                EmpleadoReadOnly readOnlyBus = new EmpleadoReadOnly();
                readOnlyBus.Id = SafeReader.GetSafeString(dr, "ID_EMPLEADO");
                readOnlyBus.NroDocumento = SafeReader.GetSafeString(dr, "NRO_DOCUMENTO");
                readOnlyBus.Nombre = SafeReader.GetSafeString(dr, "NOMBRE");
                readOnlyBus.FechaAlta = SafeReader.GetSafeDate(dr, "FECHA_ALTA").ToShortDateString();
                readOnlyBus.FechaNacimiento = SafeReader.GetSafeDate(dr, "FECHA_NACIMIENTO").ToShortDateString();
                readOnlyBus.SueldoBasico = SafeReader.GetSafeString(dr, "SUELDO_BASICO");
                readOnlyBus.DadoDeBaja = Convert.ToBoolean(dr["DADO_BAJA"]) ? "SI" : "NO";
                listReadOnlies.Add(readOnlyBus);
            }
            dr.Close();
            return listReadOnlies;
        }

        

        #endregion
    }
}
